#include "../lvgl/lvgl.h"
#include <stdio.h>
#include <stdbool.h>

typedef struct Node
{
    char name[128];

    struct Node *prev;
    struct Node *next;
}Node_t , *P_Node_t;

static P_Node_t g_current_node = NULL;
static P_Node_t head = NULL;

static lv_obj_t * list1 = NULL; 
static lv_obj_t * ImgShow  = NULL;
static lv_obj_t * img  = NULL;
static lv_obj_t * gif  = NULL;

static lv_obj_t *BtnShow = NULL;
static lv_obj_t * btn1 = NULL;
static lv_obj_t * btn2 = NULL;
static lv_obj_t *lable = NULL;                                     

static void display_image(P_Node_t Node)
{
    if (Node == NULL) return;
    
    char *str = strrchr(Node->name, '.');
    char img_src[256];
    snprintf(img_src, sizeof(img_src), "S:%s", Node->name);
    if (strcmp(str, ".gif") == 0)
    {
        if(img)
        {
            lv_obj_del(img);
            img = NULL;
        }
        if(gif == NULL)
        {
            gif = lv_gif_create( ImgShow );
            //lv_obj_set_size(gif, LV_PCT(100) , LV_PCT(100) );
            lv_obj_set_align( gif , LV_ALIGN_CENTER );
        }
        lv_gif_set_src(gif, img_src);
    }
    else if (strcmp(str, ".jpg") == 0 || strcmp(str, ".png") == 0)
    {
        if(gif)
        {
            lv_obj_del(gif);
            gif = NULL;
        }
        if(img == NULL)
        {
            img = lv_img_create( ImgShow );
            //lv_obj_set_size(img, LV_PCT(100) , LV_PCT(100) );
            lv_obj_set_align( img , LV_ALIGN_CENTER );
        }
        lv_img_set_src(img, img_src);
    }

    if (lable)
    {
        lv_obj_del(lable);
        lable = NULL;
    }
    lable = lv_label_create( BtnShow );
    // 设置尺寸
    lv_obj_set_width(  lable , 300 );
    lv_obj_set_height( lable , 80 ) ;
    lv_obj_set_align( lable ,  LV_ALIGN_BOTTOM_MID );
    // 设置字体颜色
    lv_obj_set_style_text_color(lable,  lv_color_hex(0x0000ff) , _LV_STYLE_STATE_CMP_SAME );
    // 设置字体
    lv_obj_set_style_text_font(lable , &lv_font_montserrat_32 , 0 );
    // 设置信息
    lv_label_set_text( lable , Node->name);
    // 设置长文本模式 
    lv_label_set_long_mode(lable , LV_LABEL_LONG_SCROLL_CIRCULAR );
}

static void event_handler(lv_event_t *e)
{
    P_Node_t tmp = lv_event_get_user_data(e);
    while(strcmp(g_current_node->name , tmp->name))
    {
        g_current_node = g_current_node->next;
    }
    display_image(g_current_node);
}

static void event_handler_btn(lv_event_t *e)
{
    bool Next = lv_event_get_user_data(e);
    if(Next)
    {
        g_current_node = g_current_node->next;
        if(g_current_node == head)
            g_current_node = g_current_node->next;
    }  
    else
    {
        g_current_node = g_current_node->prev;
        if(g_current_node == head)
            g_current_node = g_current_node->prev;
    }    
    display_image(g_current_node);
}

static void ListInit( void  )
{
    // 创建List对象
    list1 = lv_list_create(lv_scr_act());
    // 设置宽30% 高为100%
    lv_obj_set_size(list1, LV_PCT(30) , LV_PCT(100) );
    lv_obj_set_align( list1 ,  LV_ALIGN_LEFT_MID);

    // 添加标题
    lv_list_add_text(list1, "IMG File List");

    head = Node_Init(NULL);
    Search_Recursion(head, "/userdata/Linjie/img", ".gif");
    Search_Recursion(head, "/userdata/Linjie/img", ".jpg");
    Search_Recursion(head, "/userdata/Linjie/img", ".png");
    
    // 遍历目录并获得文件列表
    lv_obj_t * btn;

    for (P_Node_t tmp = head->next ; 
            tmp != head ; 
            tmp = tmp->next )
    {
        btn = lv_list_add_btn(list1, LV_SYMBOL_FILE, tmp->name );
        // 用户参数选择传递tmp ，为了方便在回调函数中直接显示用户选中的对应的图像文件
        lv_obj_add_event_cb(btn, event_handler, LV_EVENT_CLICKED, tmp );
    }

}

static void BtnInit(void)
{
    // 创建按钮
    btn1 = lv_btn_create( BtnShow );
    // 设置对齐方式 LV_ALIGN_BOTTOM_LEFT 左下角
    lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 0, -20);
    // 给按钮添加标签
    lv_obj_t * label1 = lv_label_create(btn1);
    // 设置标签的文本
    lv_label_set_text(label1, "Prev");
    // 设置居中对齐
    lv_obj_center(label1);
    // 设置字体
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_32, 0);
    // 添加回调函数（给按钮注册一个按下后的响应函数）
    lv_obj_add_event_cb(btn1, event_handler_btn, LV_EVENT_CLICKED, false);

    // 创建按钮
    btn2 = lv_btn_create( BtnShow );
    // 设置对齐方式 LV_ALIGN_BOTTOM_LEFT 左下角
    lv_obj_align(btn2, LV_ALIGN_BOTTOM_RIGHT, 0, -20);
    // 给按钮添加标签
    lv_obj_t * label2 = lv_label_create(btn2);
    // 设置标签的文本
    lv_label_set_text(label2, "Next");
    // 设置居中对齐
    lv_obj_center(label2);
    // 设置字体
    lv_obj_set_style_text_font(label2, &lv_font_montserrat_32, 0);
    // 添加回调函数（给按钮注册一个按下后的响应函数）
    lv_obj_add_event_cb(btn2, event_handler_btn, LV_EVENT_CLICKED, true);
}

void Imgdir_playback()
{
    
    // 设置当前活跃界面的字体，并由于该设置会被左右子类部件继承（可以理解为所有的字体进行统一设置）
    lv_obj_set_style_text_font(lv_scr_act()  , &lv_font_montserrat_32 , 0 );
    
    // 初始化列表区
    ListInit();
    
    g_current_node = head->next;
    
    // 初始化图像展示区
    ImgShow = lv_obj_create( lv_scr_act() );
    lv_obj_set_size(ImgShow, LV_PCT(70) , LV_PCT(80) );
    lv_obj_align_to( ImgShow , list1 , LV_ALIGN_OUT_RIGHT_TOP , 0 , 0 );   
    
    BtnShow = lv_obj_create( lv_scr_act() );
    lv_obj_set_size(BtnShow, LV_PCT(70) , LV_PCT(20) );
    lv_obj_align_to( BtnShow , ImgShow , LV_ALIGN_OUT_BOTTOM_MID , 0 , 0 );
    BtnInit();
}